import useDictStore from "@/store/modules/dict"
import {getDicts} from "@/api/system/dict/data"
import {ref, toRefs} from "vue"

/**
 * 获取字典数据
 */
export function useDict(...args) {
    const res = ref({})
    return (() => {
        args.forEach((dictType, index) => {
            res.value[dictType] = []
            const dicts = useDictStore().getDict(dictType)
            if (dicts) {
                res.value[dictType] = dicts
            } else {
                getDicts(dictType).then((resp) => {
                    res.value[dictType] = resp.data.map((p) => ({
                        label: p.dictLabel,
                        value: p.dictValue,
                        elTagType: p.listClass,
                        elTagClass: p.cssClass
                    }))
                    useDictStore().setDict(dictType, res.value[dictType])
                })
            }
        })
        return toRefs(res.value)
    })()
}

/**
 * 获取字典标签
 * @param {Array} dictData 字典数据数组
 * @param {String|Number} value 字典值
 * @param {String} defaultLabel 默认标签，当找不到匹配项时返回
 * @returns {String} 字典标签
 */
export function getDictLabel(dictData, value, defaultLabel = '未知') {
    if (!dictData || (!value && value !== 0)) {
        return defaultLabel
    }
    // 处理字典数据可能是 ref 的情况
    const data = dictData.value || dictData
    if (!Array.isArray(data)) {
        return defaultLabel
    }
    // 使用宽松比较来处理数字和字符串的匹配
    const item = data.find(item => item.value == value)
    return item ? item.label : defaultLabel
}

/**
 * 获取字典标签类型（样式）
 * @param {Array} dictData 字典数据数组
 * @param {String|Number} value 字典值
 * @param {String} defaultType 默认类型，当找不到匹配项时返回
 * @returns {String} 字典标签类型
 */
export function getDictType(dictData, value, defaultType = 'default') {
    if (!dictData || (!value && value !== 0)) {
        return defaultType
    }
    // 处理字典数据可能是 ref 的情况
    const data = dictData.value || dictData
    if (!Array.isArray(data)) {
        return defaultType
    }
    // 使用宽松比较来处理数字和字符串的匹配
    const item = data.find(item => item.value == value)
    return item ? (item.elTagType || defaultType) : defaultType
}